package cn.tedu.ivos.base.exception;

import cn.tedu.ivos.base.response.JsonResult;
import cn.tedu.ivos.base.response.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * ExceptionHandler注解:
     * 1.表示方法为具体的异常处理方法，需要一个异常处理类型的形式参数
     * 1.1 优先查找该控制器异常对应的异常处理方法
     * 1.2 如果没有找到对应的异常处理方法，则会查找父类的异常处理方法
     * 1.3 如果也没有找到父类的异常处理方法，则会直接走SpringMVC的异常处理逻辑
     */
    @ExceptionHandler
    public JsonResult doHandleServiceException(ServiceException ex){

        log.error("ServiceException参数异常：{}", ex.getStatusCode().getMsg());
        log.error("ServiceException参数异常：{}", ex.getStatusCode().getCode());
        //将错误状态码返回给前端
        return new JsonResult(ex.getStatusCode());
    }
    /**
     * 1.第一个异常处理方法IllegalArgumentException参数异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public JsonResult doHandleIllArgumentException(IllegalArgumentException ex){
        //获取异常提示信息：ex.getMessage()【微博ID值无效】
        String message = ex.getMessage();
        log.error("IllegalArgumentException参数异常：{}", message);
        return new JsonResult(StatusCode.OPERATION_FAILED,message);
    }

    /**
     * 2.第二个异常处理方法RuntimeException运行时异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public JsonResult doHandleRuntimeException(RuntimeException ex){
        String message = ex.getMessage();
        log.error("RuntimeException运行时异常：{}", message);
        return new JsonResult(StatusCode.OPERATION_FAILED,message);
    }

    /**
     * 第三个异常处理方法MethodArgumentNotValidException参数异常
     * 专门处理POJO类型校验抛出的异常
     * 1.SpringValidation框架抛出
     * 2.校验POJO类型属性时，参数未满足要求
     * @param ex
     * @return
     */
    @ExceptionHandler
    public JsonResult doHandleMethodArgumentNotValidException(MethodArgumentNotValidException ex){
        //Validation验证框架中，验证POJO类型阐述获取提示消息使用
        //ex,getFieldError().getDefaultMessage();
        String message = ex.getFieldError().getDefaultMessage();
        log.error("MethodArgumentNotValidException参数异常：{}", message);
        return new JsonResult(StatusCode.VALIDATE_ERROR,message);
    }

    @ExceptionHandler
    public JsonResult doHandleConstraintViolationException(ConstraintViolationException ex){
        //selectById.id ： 微博ID必须在200-1000之间
        String message = ex.getMessage().split(":")[1].trim();
        log.error("ConstraintViolationException参数异常：{}", message);
        return new JsonResult(StatusCode.VALIDATE_ERROR,message);
    }
}
